package com.changan.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * @program: xg-parent
 * @description: 登录日志的aop
 * @author: Mr.Nie
 * @create: 2022-03-14 15:54
 **/
@Aspect
@Component
public class LoginLogAop {

    /**
     * @Pointcut用来定义切入点
     * 方法名称就是切入的名称
     */
    @Pointcut("execution(* com.changan.service..*.add*(..))")
    public void pointcut(){

    }

    @Around("pointcut()")
    public void around(ProceedingJoinPoint jp){
        /*
         * getTarget()  获取这个类的名称
         * getSignature().getName() 获取这个方法的名称
         * jp.getArgs():获取该类中方法的参数
         * */

        //这个属于前置增强
        System.out.println("调用了"+jp.getTarget()+"的"+jp.getSignature().getName()+"方法的参数是"+ Arrays.toString(jp.getArgs()));
        try {
            //jp.proceed():获取方法的返回值
            Object result = jp.proceed();
            //后置增强
            System.out.println("调用了"+jp.getTarget()+"的"+jp.getSignature().getName()+"方法的返回值是"+ result);
        }catch (Throwable e){
            //异常增强
            System.out.println("异常增强");
            try {
                throw e;
            } catch (Throwable throwable) {
                throwable.printStackTrace();
            }
        }finally {
            //最终增强
            System.out.println("最终增增强");
        }
    }
}
